#include<bits/stdc++.h> usingnamespace std; int t, n, a[500005]; intgcd(int a, int b) { if (!b) return a; returngcd(b, a % b); } voidsolve() { unordered_map<int, int> l_g, a1_an; int g = 0; cin >> n;
// 分解质因子(a1至an, lcm) + 求gcd。 for (int i = 1; i <= n; i++) { cin >> a[i]; g = gcd(g, a[i]); int x = a[i]; int cnt = 0; for (int j = 2; j * j <= x; j++) { cnt = 0; if (x % j == 0) { while (x % j == 0) { cnt++; x /= j; } a1_an[j] += cnt; l_g[j] = max(l_g[j], cnt); // 几个数的lcm等于他们共同的质因子求最高次幂。 } } if (x != 1) { a1_an[x] += 1; l_g[x] = max(l_g[x], 1); } }
// 直接将gcd的质因子累加到gcd里即可。 for (int i = 2; i * i <= g; i++) { int cnt = 0; if (g % i == 0) { while (g % i == 0) { cnt++; g /= i; } l_g[i] += cnt; } } if (g != 1) l_g[g] += 1;
// 使用map实现。 #include<bits/stdc++.h> usingnamespace std; int t, n, a[500005]; intgcd(int a, int b) { if (!b) return a; returngcd(b, a % b); } voidsolve() { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i];
if (n == 2) { cout << "Yes" << endl; return; } unordered_map<int, int> have; for (int i = 1; i <= n; i++) { int x = a[i]; for (int j = 2; j * j <= x; j++) { if (x % j == 0) { if (have.count(j)) // 使用count函数来判断是否有相同的质因子。 { cout << "No" << endl; return; } have[j] = 1; // 如果没有则加入进去。 while (x % j == 0) x /= j; } } if (x != 1) { if (have.count(x)) { cout << "No" << endl; return; } have[x] = 1; } } cout << "Yes" << endl; } intmain() { cin >> t; while (t--) solve(); return0; }